1. Technical Field
The present invention relates generally to tools for internationalization of software. More particularly, the present invention relates to an improved method, apparatus, and computer program for performing language translation in computer software.
2. Description of Related Art
Java is an object-oriented, compiled, multi-threaded computer language that generates platform-independent executable files.
Java is object-oriented. This means, in the simplest terms, that it allows for the association of member functions or “methods” within data structures. Indeed, all Java programs are made up solely of data structure types known as “classes,” where classes contain both data fields and methods.
Classes may “inherit” characteristics of other classes. When a “descendant” class inherits from another “ancestral” class, it inherits all of the data fields and methods of the ancestral class. In addition, a descendent class may provide its own methods to supplement or take the place of ancestral class methods.
Java is compiled. That means that before a Java program (written as source code) can be executed, it must be processed by a compiler to make an executable form of the program. Executable Java programs are stored in “.class” files, with each “.class” file containing executable object code for a single Java class.
Java is multi-threaded. This means that a single Java program can have several sequences of code executing concurrently. Each of these sequences is known as a thread. Multi-threaded program languages, such as Java, are very useful when writing software such as, for instance, communication software, where it is helpful to allow the software to perform other tasks while waiting for input.
Java produces platform-independent executables. When a Java program is compiled to produce “.class” files, those “.class” files are capable of being executed on any platform having a Java runtime environment. A Java runtime environment is a piece of software that allows a computer to executes Java “.class” files. Java runtime environments are available for many, if not most, commonly used computer platforms today.
There are essentially two kinds of Java runtime environments: interpreters and just-in-time compilers. Interpreters directly interpret the binary code contained in “.class” files and execute instructions corresponding to that binary code as the interpretation process is carried out. Just-in-time compilers, on the other hand, first translate the binary code into native instructions, then execute the native instructions. Native instructions are instructions that are designed to be executed directly by the computer's hardware.
Java's “write once, run anywhere” philosophy extends not only into the realm of platform independence, but also to that of software internationalization, where a principle of “write once, run anywhere in the world” applies. Java was among the first computer language standards to embrace Unicode, a sixteen-bit character set standard that includes not only the twenty-six letters of modern English, but a variety of characters and accented characters used in other languages. The sixteen-bit standard allows a sufficient range of characters (65,536) not only for the inclusion of multiple alphabets, such as Cyrillic and Hebrew, but also for the character sets of languages such as Chinese and Japanese. Chinese does not use an alphabet but relies on the use of thousands of different ideograms; Japanese uses two alphabets in addition to a set of approximately two thousand ideograms.
Java also provides a facility for internationalization known as “Resource Bundles.” Resource bundles are files that store the text messages displayed by a Java program. When a Java program uses resource bundles, it loads its text messages from the resource bundle to be displayed to a user.
By separating text messages from the program code that displays them, it becomes easier to generate versions of a program that display in different languages. To make a German translation of an English original to a program, for instance, one need only create a German resource bundle to be interchanged with the English one. Thus, keeping to Java's “write once, run anywhere” philosophy, the Java program code need only be written and compiled once.
The task of translating a piece of software from one language to another, then, consists of translating the text contained in a resource bundle to produce a replacement resource bundle containing the translation text. Although this scheme is simple from a theoretical and technological standpoint, in practice the task of translating software is more complicated.
It is generally impractical for a software-producing organization to employ a staff of translators for every language at every location in the organization where software is produced. A more practical approach, and one that is generally taken within the industry, is assign the responsibility for software translation to one or more translators in remote locations (often in other countries). In theory, a simple approach to software translation would be to send the resource bundles associated with a product to the translator, have the translator make new resource bundles containing translated text, then have the translator return the new resource bundles.
This approach is error prone, however. The translator, having only the text of the program to look at, is at a loss as to the context in which the text is used. When a translator is given no context in which to understand the text, the translator must make a guess as to which meaning is intended and choose a translation that matches the meaning. For instance, the English word “stop” may be translated into German as “halten,” “anhalten,” “aufhalten,” “aufhören,” “abstellen,” “einstellen,” or “stehenbleiben,” depending on the context. The best a translator can do, having only the word “stop” to translate into German, is to pick a likely candidate, for instance “halten.” Then, at some later time, the translator can view the completed translated software title to check the context.
Because translators are not usually technically trained or familiar with the technical details of the software they are translating, however, viewing the completed title may be unduly difficult for the translator. Many software products today, particularly those intended to be operated over a network, are difficult to set up and operate, particularly for one with little technical background. It is often impractical for a translator working in a remote location from the software developers to have a working copy of the software installed at the translator's location. When this is the case, often the only viable option is to have the translator travel to the software developers' location and “proofread” the translated software under the direction of the developers.
Another problem that a translator may experience is that the translator may not know enough about operating the software to be able to observe all of the necessary textual messages within the context of the program. In such cases, the developers' assistance is also needed to ensure that all messages are displayed in context for translation.
What is needed then, is a method of translating the text of a software product that reduces the necessity of the translator working face-to-face with software developers.